/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import helpClasses.ReportProperties;
import hibernate.Request;
import hibernate.RequestDAO;
import hibernate.UserRole;
import java.util.HashMap;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateful;

/**
 *
 * @author aboyko
 */
@Stateful
@LocalBean
public class ReportManager extends ManagedEJB {

    private Security security;
    @EJB
    private RequestDAO requestDAO;
    /*
     * Метод  проверяет роль пользователя и возвращает список доступных заявок
     * если роль "Менеджер" или "Президент" возвращает все заявки
     * если роль "Пользователь" возвращает только заявки пользователя или заявки на общие продукты
     * 
     * @return список заявок
     */
    public List<Request> getRequests() {
        String query;
        HashMap<String, Object> params = new HashMap<String, Object>();
        if (security.isAuthorized()) {
            if (security.getCurrentUser().getRole().equals(UserRole.GET_USER_ROLE())) {
                query = "from Request where user = :user or product.common = :common";
                params.put("user", security.getCurrentUser());
                params.put("common", true);
                return requestDAO.getRequests(query, params);
            } else {
                return requestDAO.getAllRequests();
            }
        } else {
            return null;
        }
    }

    /*
     * Метод возвращает список заявок согласно параметрам отбора установленных 
     * в объекте класса ReportProperties
     * 
     * @return список заявок
     */
    public List<Request> getRequests(ReportProperties rp) {
        if (security.isAuthorized()) {
            Map<String, Object> parameters = new HashMap<String, Object>();
            String query = preapareDAOIncome(rp, parameters);
            return requestDAO.getRequests(query, parameters);
        } else {
            return null;
        }
    }
    
    /*
     * Метод герерирует строчку запроса согласно параметрам отбора установленных 
     * в объекте класса ReportProperties
     * 
     * @return строка запроса
     */    
    public String preapareDAOIncome(ReportProperties rp, Map<String, Object> parameters) {
        StringBuilder contents = new StringBuilder();
        contents.append("from Request ");

        if (rp.getMessage() != null) {
            contents.append(" and message like %:message%");
            parameters.put("message", rp.getMessage());
        }
        if (rp.getDescripton() != null) {
            contents.append(" and descrition like %:description%");
            parameters.put("desciption", rp.getDescripton());
        }
        if (rp.getDateFrom() != null) {
            contents.append(" and inDate >= :dateFrom");
            parameters.put("dateFrom", rp.getDateFrom());
        }

        if (rp.getDateTo() != null) {
            contents.append(" and inDate <= :dateTo");
            parameters.put("dateTo", rp.getDateTo());
        }
        if (!rp.getProducts().isEmpty()) {
            contents.append(" and product in (:products)");
            parameters.put("products", rp.getProducts());
        }

        if (!rp.getManagers().isEmpty()) {
            contents.append(" and manager in (:managers)");
            parameters.put("managers", rp.getManagers());
        }

        if (!rp.getUsers().isEmpty()) {
            contents.append(" and user in (:users)");
            parameters.put("users", rp.getUsers());
        }
        if (!rp.getStatuses().isEmpty()) {
            contents.append(" and status in (:statuses)");
            parameters.put("statuses", rp.getStatuses());
        }
        if (rp.isFilterByCommon()) {
            contents.append(" and product.common = :common");
            parameters.put("common", rp.isCommon());
        }
        
        /* 
         * Если роль пользователя "User" и запрос делается не только по 
         * общим продуктам, ограничиваем выборку условием, что
         * "создатель заявки" = "текущий пользователь"
         */
        if(security.getCurrentUser().getRole().equals(UserRole.GET_USER_ROLE())) {
            if (!(rp.isCommon() && rp.isFilterByCommon())) {
                contents.append(" and userID =:user");
                parameters.put("user", security.getCurrentUser());
            }
        }
        String query = contents.toString();
        return query.replaceFirst("and", "where");
    }

    @Override
    public boolean init(ServerManager serverManager) {
        //Оставить этот код без изменений!
        if (!super.init(serverManager)) {
            return false;
        }
        //Подключать необходимые бины ниже.
        security = serverManager.getSecurity();
        return true;
    }

    @Deprecated
    public List<Request> makeQuery(ReportProperties rp) {
        Map<String, Object> parameters = new HashMap<String, Object>();
        String query = preapareDAOIncome(rp, parameters);
        return requestDAO.getRequests(query, parameters);
    }

    @Deprecated
    public List<Request> getAllRequests() {
        String query;
        HashMap<String, Object> params = new HashMap<String, Object>();
        if (security.isAuthorized()) {
            if (security.getCurrentUser().getRole().equals(UserRole.GET_USER_ROLE())) {
                query = "from Request where userID = :user or isCommon = :common";
                params.put("user", security.getCurrentUser());
                params.put("common", true);
                return requestDAO.getRequests(query, params);
            } else {
                return requestDAO.getAllRequests();
            }
        } else {
            return null;
        }
    }
}
